Motivación

Creé este documento durante el último fin de semana de diciembre del 2025, cuando Colfuturo anunció que el gobierno nacional no apoyaría más al programa Crédito-Beca.

En respuesta, el ministerio de ciencia y tecnología publicó un comunicado en su cuenta de instagram donde señalaba que no habían comunicado a Colfuturo la decisión de “desmontar” el programa Crédito-Beca, y en donde argumentaban que planeaban utilizar los recursos que antes le eran otorgados a Colfuturo, para gestionar, desde el gobierno, el apoyo a posgrados en el exterior. El ministerio también publicó una gráfica en la que sugieren que la mayoría de los beneficiarios del programa pertenece a los estratos 4, 5 y 6.

Como consecuencia, Colfuturo publicó su proprio conteo de porcentajes, y tres notas aclaratorias, en las que señalaban que su gestión había sido transparente, y que toda la información relevante está disponible en su sitio web.

Así, en aras de entender un poco más las dinámicas de selección de acuerdo al estrato, utilicé los datos disponibles en los anuarios e informes anuales de gestión, para realizar algunos gráficos descriptivos, y estimar (con cautela) 1) la probabilidad marginal de que la aplicación al programa Crédito-Beca de una persona perteneciente a cualquier estrato sea exitosa, y 2) la probabilidad marginal que una persona de cualquier estrato tiene de ser elegida para ser beneficiaria, condicional a que su aplicación al programa Crédito-Beca haya sido exitosa.

Sobre los datos

Como he mencionado antes, he recopilado los datos en los que se basan las visualizaciones y análisis que presento acá de los anuarios e informes de gestión anuales que colfuturo publica en su página web. Sin embargo, creo que es importante señalar que los datos no están en un formato fácilmente utilizable, y su mayoría está consignada en tablas que aparecen en PDFs. También debo mencionar que los datos del periodo 2007 al 2024 no están completos. En particular, Colfuturo no publica la distribución del total de aplicaciones de los años 2007 al 2012. Finalmente, revisando estos documentos, noté que Colfuturo reporta el número de beneficiarios de un año, como el número de aplicaciones aprobadas de ese mismo año, pero al año siguiente.

Por ejemplo para el año 2008, Colfuturo reportó haber escogido como beneficiarios a un total de 573 personas.

Sin embargo, en el año 2009, el total de beneficiarios reportados, para el 2008, disminuyó a 499.

Con esto no sugiero ningún tipo de mala fe. Muy seguramente los beneficiarios al cierre de un año pueden disminuir si en algún punto alguna persona, avanzada en el proceso de legalización, renuncia al programa (Colfuturo incluye una proporción de personas que renuncia en sus informes anuales y en los anuarios). En cualquier caso, este es un patrón en el reporte anual de beneficiarios por estrato.

Descriptivos

Total de Solicitudes, Solicitudes Aprobadas, y Benecifiarios en el periodo 2007 - 2024.

Aunque no cuento con el total de Solicitudes (S) realizadas entre el año 2004 y el 2012, la distribución de Solicitudes Aprobadas (SA) puede inferirse del patrón que describí en la sección anterior. Así, una suposición justificable es que el número de Aplicaciones Aprobadas, por estrato, es, al menos, el total de Beneficiarios (B) que Colfuturo reporta por cada año vencido.

Solicitudes por estrato

A continuación se encuentran el conteo y proporción del total de S, discriminadas por estrato, que Colfuturo recibió para el programa crédito-beca, entre los años 2013 y 2024.

Como mencioné antes, estos datos no están disponibles para el periodo entre 2007 y 2012.

Estos datos muestran que entre el 2013 y el 2024, los estratos 1 al 3 contribuyeron cerca del 36% de las aplicaciones, y los estratos 4 al 6 el 64%.

Solicitudes Aprobadas por estrato (2008 - 2024)

Utilizando los datos por año vencido, se puede inferir el número de SA por estrato desde el 2008 hasta el 2012. Desde el 2013, Colfuturo reporta la distribución de S, SA, y B.

Entre el 2008 y el 2024, los estratos 1 al 3 obtuvieron el 30% del total de SA. Los estratos 4 al 6, el 70% del total.

Beneficiarios por Estrato (2007 - 2024)

Finalmente, los datos disponibles permiten inferir el número de B entre el 2007 y el 2024.

Quisiera resaltar esta última gráfica, ya que se ajusta bastante bien a los datos compartidos por Colfuturo en su post de X.

Estrato Reportados por Colfuturo Proporción Empírica
\(1\) \(1\%\) \(1\%\)
\(2\) \(5\%\) \(4.3\%\)
\(3\) \(20\%\) \(19.5\%\)
\(4\) \(33\%\) \(33.8\%\)
\(5\) \(21\%\) \(21.8\%\)
\(6\) \(20\%\) \(19.6\%\)
Total \(100\%\) \(100\%\)

Estimación de Probabilidad Marginal

En este link están los datos y los scripts para correr los análisis y reproducir las figuras en este documento.

Advertencia

Antes de continuar, quisiera aclarar que con este análisis no estoy buscando establecer ningún vínculo causal. Las herramientas estadísticas que utilizo acá solo pueden sugerir predicciones dado que, en su estado actual, los estadísticos estimados no han sido especificados usando un modelo causal que ajuste por variables no observadas, y que podrían predecir el éxito en el proceso.

Este es un ejercicio meramente exploratorio y predictivo, en el que la probabilidad de éxito está simplemente condicionada a 1) haber decidido aplicar al programa y 2) haber sido seleccionado para legalizar el crédito-beca.

(Cortos) Detalles metodológicos

Usando un modelo lineal generalizado (distribución binomial, logit link) con cros-clasificación (la probabilidad de SA y B varía de acuerdo al año de selección), estimé la probabilidad marginal, por estrato, de obtener una SA, y de ser B, condicional a obtener una SA.

Probabilidad de SA, condicional a S

En lo que sigue muestro el código en R que he utilizado para correr los análisis. Estas estimaciones están hechas con datos desde el 2013 hasta el 2024, dado que no hay datos de S para el periodo 2008 - 2012.

# Exclude data with missing values. Complete-case analysis is called for since data is
# not missing at random.
final_df_no_2007 <- final_df|> 
  filter(years != 2007) |> 
  select(c(1:5))

final_df_2013_onwards <- final_df|> 
  filter(years > 2012) |> 
  select(c(1:5))

# Lists with data for ulam
## Beneficiary conditional on approved
d_2008_onwards <- list(
  success = final_df_no_2007$beneficiarixs, # beneficiaries
  pre_success = final_df_no_2007$aprobadas, # approved
  estrato = final_df_no_2007$estrato,
  year = as.numeric(as.factor(final_df_no_2007$years))
)

## Approved conditional on applying
d_2013_onwards <- list(
  solicitudes = final_df_2013_onwards$solicitudes, # applications
  pre_success = final_df_2013_onwards$aprobadas,   # approved
  estrato = final_df_2013_onwards$estrato,
  year = as.numeric(as.factor(final_df_2013_onwards$years))
)

Modelo:

# Approved conditional on applying
model_pre_success_vs <- ulam(
  alist(
    pre_success ~ dbinom(solicitudes, p),
    
    logit(p) <- a_bar + z[estrato]*sigma_z_estrato + v[estrato,year],
    
    transpars> matrix[estrato,12]:v <- compose_noncentered(sigma_estrato, L_Rho_estrato, z_estrato),
    
    a_bar ~ dnorm(0,0.5),
    sigma_z_estrato ~ dexp(1),
    z[estrato] ~ dnorm(0,1),
    
    matrix[12,estrato]:z_estrato ~ normal(0,1), # Inverted matrix, 12 rows and 6 columns
    vector[12]: sigma_estrato ~ dexp(1),
    cholesky_factor_corr[12]:L_Rho_estrato ~ lkj_corr_cholesky(2),
    
    gq>matrix[12,12]:Rho_estrato <<- Chol_to_Corr(L_Rho_estrato),
    gq>vector[estrato]:a_estrato <<- a_bar + z*sigma_z_estrato
    
    
  ), data = d_2013_onwards, chains = 4, cores = 8, iter = 4000, log_lik = T
)

La siguiente tabla contiene la probabilidad marginal, por estrato, de tener una SA.

M DE IC 5.5% IC 94.5
Estrato 1 0.44 0.03 0.39 0.48
Estrato 2 0.43 0.02 0.40 0.45
Estrato 3 0.43 0.01 0.41 0.45
Estrato 4 0.49 0.01 0.47 0.50
Estrato 5 0.53 0.01 0.51 0.55
Estrato 6 0.57 0.01 0.55 0.59
Note:
M = Media. DE = Desviación estandar. IC = Intervalo de compatibilidad

La siguiente gráfica muestra la distribución de las probabilidades marginales estimadas por el modelo.

Probabilidad de ser B, condicional a tener SA

Acá está el modelo que estima la probabilidad de ser B, condicional a tener una SA, por estrato. Este modelo utiliza los datos desde el 2008, que es desde cuando Colfuturo reporta (o se infiere) la distribución de SA y B:

model_success_vs <- ulam(
  alist(
    success ~ dbinom(pre_success, p),
    
    logit(p) <- a_bar + z[estrato]*sigma_z_estrato + v[estrato,year],
    
    transpars> matrix[estrato,17]:v <- compose_noncentered(sigma_estrato, L_Rho_estrato, z_estrato),
    
    a_bar ~ dnorm(0,0.5),
    sigma_z_estrato ~ dexp(1),
    z[estrato] ~ dnorm(0,1),
    
    matrix[17,estrato]:z_estrato ~ normal(0,1), # Inverted matrix, 12 rows and 6 columns
    vector[17]: sigma_estrato ~ dexp(1),
    cholesky_factor_corr[17]:L_Rho_estrato ~ lkj_corr_cholesky(2),
    
    gq>matrix[17,17]:Rho_estrato <<- Chol_to_Corr(L_Rho_estrato),
    gq>vector[estrato]:a_estrato <<- a_bar + z*sigma_z_estrato
    
  ), data = d_2008_onwards, chains = 4, cores = 8, iter = 4000, log_lik = T
)

Probabilidad marginal, por estrato, de ser B, condicional a tener una SA:

M DE IC 5.5% IC 94.5
Estrato 1 0.56 0.05 0.48 0.65
Estrato 2 0.64 0.03 0.60 0.68
Estrato 3 0.68 0.02 0.65 0.70
Estrato 4 0.73 0.02 0.70 0.75
Estrato 5 0.76 0.02 0.74 0.79
Estrato 6 0.81 0.01 0.78 0.83
Note:
M = Media. DE = Desviación estandar. IC = Intervalo de compatibilidad

Finalmente, la siguiente gráfica contiene las distribuciones de cada probabilidad estimada.

Para terminar

Con este ejercicio, espero haber aportado a la discusión seria e informada sobre la situación actual entre Colfuturo y el gobierno.

Aunque claramente tengo una opinión firme respecto de la decisión del gobierno, preferiría omitirla acá, toda vez que aspiro a que el material que presento acá sirva de referencia, no para avanzar ninguna posición en particular.

(Largos) Detalles metodológicos

En esta sección ofrezco un poco más de detalle sobre los modelos que he utilizado.

Especificación del modelo

Esta es la especificación matemática del modelo para estimar la probabilidad de tener una SA, condicional a S. La especificación para estimar la probabilidad de ser B, condicional a tener una SA es igual, pero la variable a estimar es S y el primer argumento de la distribución binomial es SA:

\[\begin{align*} SA_i &\sim \text{Binomial}(\text{S}_i, p_i) \\ \text{logit}(p_i) &= \bar{\alpha} + z_{\text{Estrato}[i]}\sigma_{\text{Int. Estrato}} + v_{\text{Estrato}[i],\text{Año}[i]} \\ \bar{\alpha} &\sim \text{Normal}(0,0.5)\\ v &= \bigl(\text{diag}(\sigma)\text{L}\text{Z}\bigr)^{\intercal} \\ \text{Z}_{j,k} &= \text{Normal}(0,1) \\ \sigma_{\text{Int. Estrato}},\sigma &\sim \text{Exponential}(1) \\ \text{R} &\sim \text{LKJCorr}(2) \end{align*}\]

Este es un modelo de cros-clasificación, o de interacción, que permite la variabilidad en la probabilidad de que cada estrato tiene de tener una SA (o de ser B), por cada año observado. Esta variación es obtenida en la línea \(v = \bigl(\text{diag}(\sigma)\text{L}\text{Z}\bigr)^{\intercal}\), en la que, a partir de una distribución normal multivariada, se estiman los interceptos y las pendientes de cada estrato por cada año. Esta estrategia permite que las estimaciones se informen a medida que el modelo encuentra más y más clusters de variación en los datos. Sin embargo, la estimaciones no parten necesariamente de la nada, y por ello se proveen distribuciones previas con constricciones plausibles. En esencia, esta es una versión Bayesiana1 de un modelo de partial pooling.

Además, para hacer el sampling de la distribución posterior de cada paráetro más eficiente, los priors para cada estimado están des-centrados. Es decir, ninguna de las distribuciones previas asumidas para cada parámetro depende de más parámetros.

Parámetros del modelo

SA Condicional a S

Estos son los parámetros del modelo en escala log-odds:

M DE IC 5.5% IC 94.5 Rhat
Estrato 1 -0.26 0.12 -0.44 -0.07 1
Estrato 2 -0.30 0.06 -0.40 -0.19 1
Estrato 3 -0.29 0.05 -0.37 -0.20 1
Estrato 4 -0.06 0.05 -0.13 0.02 1
Estrato 5 0.10 0.05 0.03 0.18 1
Estrato 6 0.27 0.05 0.18 0.36 1
Note:
M = Media. DE = Desviación estandar. IC = Intervalo de compatibilidad. Los parametros están enescala de log-odds

Técnicamente, con esta información podemos realizar contrastes entre estratos. Por ejemplo, la diferencia de probabilidad de tener una SA entre el estrato 1 y el 6 es del \(13\%\):

M DE IC 5.5% IC 94.5
Estrato 1 - Estrato 6 -0.13 0.03 -0.18 -0.08
Estrato 2 - Estrato 5 -0.10 0.02 -0.13 -0.07
Estrato 3 - Estrato 4 -0.06 0.01 -0.08 -0.04
Note:
M = Media. DE = Desviación estandar. IC = Intervalo de compatibilidad. Los parametros están enescala de probabilidad

Finalmente, esta gráfica muestra la variación, por año, que el modelo estima para cada estrato. Hay 12 años, y 6 estratos por año, así que hay 72 valores en el eje \(y\). Así, los 6 primeros estimados corresponden a la variación en probabilidad en el 2013, los siguientes 6 a la variación en el año 2014, etc.

B condicional a SA

De nuevo, los parámetros en log-odds y probabilidad:

M DE IC 5.5% IC 94.5 Rhat
Estrato 1 0.26 0.22 -0.09 0.61 1
Estrato 2 0.57 0.12 0.39 0.76 1
Estrato 3 0.74 0.08 0.61 0.86 1
Estrato 4 0.98 0.08 0.86 1.10 1
Estrato 5 1.18 0.09 1.03 1.33 1
Estrato 6 1.43 0.10 1.28 1.59 1
Note:
M = Media. DE = Desviación estandar. IC = Intervalo de compatibilidad. Los parametros están enescala de log-odds

Contrastes entre estratos:

M DE IC 5.5% IC 94.5
Estrato 1 - Estrato 6 -0.24 0.05 -0.33 -0.16
Estrato 2 - Estrato 5 -0.13 0.03 -0.17 -0.08
Estrato 3 - Estrato 4 -0.05 0.02 -0.08 -0.02
Note:
M = Media. DE = Desviación estandar. IC = Intervalo de compatibilidad. Los parametros están enescala de probabilidad

Variación por año. En este caso hay 17 años, así que hay 17 periodos de 6 líneas en la gráfica:


  1. McElreath, R. (2020). Statistical Rethinking: A Bayesian Course with Examples in R and STAN (2nd ed.). Chapman & Hall.↩︎